package top.lishuoboy.dependency.base.core;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.SystemClock;
import cn.hutool.core.lang.Singleton;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;

public class MyIdUtil {
    private static final Snowflake SNOWFLAKE = Singleton.get(Snowflake.class, DateUtil.parseDate("2024-01-01"), 0L, 0L, false);

    public static String getId(String pre) {
        /**
         epochDate              默认 2010                        初始化时间起点（null表示默认起始日期）,后期修改会导致id重复,如果要修改连workerId centerId，慎用。
         workerId               默认 根据数据中心和进程id计算        工作机器节点id
         centerId               默认 根据网卡计算                  数据中心id
         isUseSystemClock       默认 false                       是否使用{@link SystemClock} 获取当前时间戳
         timeOffset             默认 2000ms                      允许时间回拨的毫秒数
         randomSequenceLimit    默认 0                           限定一个随机上限，在不同毫秒下生成序号时，给定一个随机数，避免偶数问题，0表示无随机，上限不包括值本身。
         */
        long snowId = SNOWFLAKE.nextId();
        // 转为二进制，补齐0至64位
        String snowIdBinary = StrUtil.fillBefore(Long.toBinaryString(snowId), '0', 64);
        String centerId = MyRadixUtil.convert(snowIdBinary.substring(42, 47), 2, 64);
        String workerId = MyRadixUtil.convert(snowIdBinary.substring(47, 52), 2, 64);
        String sequence = MyRadixUtil.convert(snowIdBinary.substring(52), 2, 64);
        sequence = StrUtil.fillBefore(sequence, '0', 2);

        // 1. 获取时间
        String dateTime = DateUtil.format(DateUtil.date(SNOWFLAKE.getGenerateDateTime(snowId)), "yyyyMMdd.HHmmss.SSS");
        return pre + dateTime + "." + sequence + "." + centerId + workerId;
    }

    public static String getId() {
        return getId("");
    }

}
